package org.atlantis.grosbeak.cable;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.atlantis.grosbeak.cable.action.ActionMethod;
import org.atlantis.grosbeak.depot.Depot;
import org.atlantis.grosbeak.lang.Mirror;

/**
 * Web控制层的一个工具类。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 * 
 */
abstract class CableUtils {

	static final String LOCALE_NAME = "org.atlantis.grosbeak.cable.locale";

	/**
	 * 获取IOC容器。
	 * 
	 * @param request
	 *            从HttpServletRequest获取当前的ServletContext，然后从ServletContext中获取IOC容器
	 *            。
	 * @see #getDepot(ServletContext)
	 * @return 当前系统的IOC容器。
	 */
	public static Depot getDepot(HttpServletRequest request) {
		return (Depot) request.getSession().getServletContext().getAttribute(
				Depot.class.getName());
	}

	/**
	 * 获取IOC容器。
	 * 
	 * @param context
	 *            从ServletContext中获取IOC容器（IOC容器储存在ServletContext中的）。
	 * @return 当前系统的IOC容器。
	 */
	public static Depot getDepot(ServletContext context) {
		return (Depot) context.getAttribute(Depot.class.getName());
	}

	/**
	 * 倒转Map，即互换Map的Key和Value。
	 * 
	 * @param source
	 * @return
	 */
	public static Map<Object, String> reverseMap(Map<String, Object> source) {
		Map<Object, String> target = new HashMap<Object, String>();
		for (Map.Entry<String, Object> entry : source.entrySet()) {
			target.put(entry.getValue(), entry.getKey());
		}
		return target;
	}

	/**
	 * 获取一个类中所有标注了ActionMethod注解的方法。
	 * 
	 * @param type
	 * @return
	 */
	public static List<Method> getActionMethods(Class<?> type) {
		Mirror<?> mir = Mirror.me(type);
		Method[] methods = mir.getAllDeclareMethods(Object.class);
		ArrayList<Method> methodList = new ArrayList<Method>();
		for (Method method : methods)
			if (method.isAnnotationPresent(ActionMethod.class))
				methodList.add(method);
		return methodList;
	}
}
